package com.ming_za.odupdaterserver.api;

import com.ming_za.odupdaterserver.core.service.ReturnBusinessPackage;
import com.ming_za.odupdaterserver.core.service.res.obj.MainUpdateItem;
import com.ming_za.odupdaterserver.core.service.update.res.ResDownload;
import com.ming_za.odupdaterserver.core.sqlite.domain.Label;
import com.ming_za.odupdaterserver.core.sqlite.domain.Res;
import com.ming_za.odupdaterserver.core.vo.req.ResAddVo;
import com.ming_za.odupdaterserver.core.vo.req.SetResClientPathVo;
import com.ming_za.odupdaterserver.core.vo.req.SetResLabelVo;
import com.ming_za.odupdaterserver.core.vo.resp.ResAssociatedVersionResp;
import com.ming_za.odupdaterserver.core.vo.resp.VersionInfoResp;

import java.io.InputStream;
import java.util.List;

/**
 * 更新器接口
 * <p>规定更新器所有功能</p>
 * <p>调用更新功能时应该调用该接口的方法</p>
 */
public interface Updater {

    /**
     * 启动单个资源更新
     * @param resId 资源id
     * @param ip 更新请求ip
     * @return {@link ResDownload},否则返回null
     */
    ReturnBusinessPackage<ResDownload> updateRes(long resId, String ip,boolean checkPublished);

    /**
     * 获取传入资源对版本的影响
     * @param resId 资源数组
     * @return 资源版本对应列表
     */
    List<ResAssociatedVersionResp> getInfluenceOfResOnVersion(Long[] resId);

    /**
     * 获取存在传入标签的所有资源
     * @param label 单个标签
     * @return 资源id列表
     */
    ReturnBusinessPackage<List<Long>> getInfluenceOfLabelOnRes(long label);

    /**
     * 获取传入标签受影响的所有子级
     * @param label 单个标签
     */
    ReturnBusinessPackage<List<Label>> getInfluenceOfLabelOnExtends(long label);

    /**
     * 获取客户端版本到最新版之间的所有版本
     * @param clientVersion 客户端版本
     * @param isPublished 是否为发布内容
     */
    List<Integer> getVersionBetweenClientVersion(Integer clientVersion,boolean isPublished);

    /**
     * 获取所有传入版本的资源，忽略标签
     * @param version 版本号
     * @return 存在内容时返回 MainUpdateItem 列表
     */
    ReturnBusinessPackage<List<MainUpdateItem>> getVersionResAll(Integer version);

    /**
     * 获取指定版本需要更新的资源内容
     * @param version 版本号
     * @param label 标签
     * @param isPublished 是否为发布内容
     * @param clientVersion 客户端支持服务器的版本，用于区分不同客户端支持的内容
     */
    ReturnBusinessPackage<List<MainUpdateItem>> getUpdateRes(Integer version, long label,boolean isPublished,int clientVersion);

    /**
     * 获取所有标签
     */
    List<Label> getAllLabel();

    /**
     * 获取所有版本详细信息
     * @return 版本详细信息
     */
    List<VersionInfoResp> getAllVersionInfo();

    /**
     * 添加标签
     * @param name 标签名
     * @param parent 标签父级，可为null
     * @return 返回标签id
     */
    Long addLabel(String name,Long parent);

    /**
     * 删除标签
     * @param labelId 标签id
     */
    ReturnBusinessPackage<Void> delLabel(long labelId);

    ReturnBusinessPackage<Void> setLabelParent(long labelId, long parent);

    /**
     * 添加资源
     * @param res 资源信息对象
     * @param fileInput 文件输入流
     */
    ReturnBusinessPackage<Long> addRes(ResAddVo res, InputStream fileInput);

    /**
     * 创建未发布版本
     */
    ReturnBusinessPackage<Void> newVersion();

    /**
     * 删除资源
     * @param resId 资源id
     */
    ReturnBusinessPackage<Void> delRes(Long[] resId,Integer version);

    /**
     * 为资源设置标签
     */
    void setResLabel(SetResLabelVo[] setResLabelVo);

    /**
     * 设置客户端资源地址
     */
    void setClientPath(SetResClientPathVo[] setResClientPathVos);

    /**
     * 修改未发布版本
     * <p>发布后的版本不可修改</p>
     * <p>由于仅可存在一个未发布版本，所以不需要传入原版本号</p>
     * @param version 新版本号
     */
    ReturnBusinessPackage<Void> modifyVersion(Integer version);

    /**
     * 删除版本
     * <pre>删除版本同时删除版本相关的所有资源</pre>
     * @param version 版本号
     */
    ReturnBusinessPackage<Void> removeVersion(Integer version);

    /**
     * 发布版本
     * <pre>仅可存在一个未发布版本，所以不需要传入版本号</pre>
     */
    ReturnBusinessPackage<Object> publishedVersion();

    List<Integer> getAllVersion();

    /**
     * 获取资源详细信息
     * @param resId 资源id
     */
    Res getResInfo(Long resId);

}
